package com.wnxy.mallserver.service.impl;

import com.wnxy.mallserver.entity.Goods;
import com.wnxy.mallserver.exception.GoodsStockException;
import com.wnxy.mallserver.mapper.GoodsMapper;
import com.wnxy.mallserver.response.Message;
import com.wnxy.mallserver.service.GoodsService;
import com.wnxy.mallserver.vo.goods.GoodsListVo;
import org.springframework.cache.annotation.Cacheable;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import javax.annotation.Resource;
import java.util.List;

@Service
public class GoodsServiceImpl implements GoodsService {
    @Resource
    private GoodsMapper goodsMapper;


    //根据cid查询商品信息（部分信息）--返回商品信息集合
    @Cacheable("findGoodsBycid")//将查到的数据，放进缓存中
    @Override
    public List<GoodsListVo> findGoodsBycid(Integer cid) {
        return goodsMapper.findGoodsBycid(cid);
    }

    @Cacheable("findById")
    @Override
    public Goods findById(Integer id) {
        return goodsMapper.findById(id);
    }

    /**
     * 修改商品中的库存
     * synchronized:锁住该条操作，“只能我操作，别人只能排队等我操作完再操作”
     * */
    @Transactional
    @Override
    public synchronized void updateStock(Integer gid, Integer num) {
        //1.获取库存
        int stock = goodsMapper.findStockById(gid);
        //2.购买数量大于库存，抛异常.---这里目前有逻辑问题，即因为被锁住了，且num传过来为负数，所以不会有比库存量大的时候
        if(num<0){
            //Math.abs(): 取绝对值
            if(Math.abs(num) > stock){
                throw new GoodsStockException(Message.GOODS_UNDER_STOCK,gid,stock);
            }
        }
        //3.没有抛异常，则进行库存删减
        goodsMapper.updateStock(gid,num);

    }


}
